package com.lmy.quartz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * SpringBoot 整合 Quartz 实现并发执行定时任务
 * Quartz定时任务默认都是并发执行的，不会等待上一次任务执行完毕，只要间隔时间到就会执行，如果定时任务执行太长，会长时间占用资源，导致其他任务堵塞
 */
public class TestJob {

    public static void main(String[] args) {
        //定义变量count，统计定时任务执行次数
        int count = 0;
        //1.构建JobDetail对象
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("job1", "group1") //指定任务名 任务分组
                .usingJobData("jobDetailInfo", "lmyJob")  //设置参数JobDataMap
                .usingJobData("name", "jobDetail")  //当key和定时任务对象的某个属性对应时，会自动调用setter方法设置属性
                .requestRecovery(true)  //job可恢复，scheduler因为各种原因重启时，该job会被重新执行
                .usingJobData("count", count)
                .build();
        //2.构建Trigger触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")  //指定触发器名 触发器分组
                .usingJobData("triggerInfo", "lmyTrigger")
                //.usingJobData("name", "trigger")
                .startNow() //立即执行
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()    //按间隔时间执行
                                .withIntervalInSeconds(1)   //间隔时间1s
                                .repeatForever())   //重复执行
                .build();
        //3.构建Scheduler调度器
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            //4.将JobDetail 和 Trigger触发器放入 Scheduler对象
            scheduler.scheduleJob(jobDetail, trigger);
            //5.以多线程模式启动定时任务
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}
